import {defineStore} from 'pinia'
import {ref,computed} from 'vue'
import {useUserStore} from './userStore'
import {insertCartApi,findNewCartListApi,delCartApi} from '@/apis/cart'

export const useCartStore=defineStore('cart', ()=>{
  const userStore=useUserStore()
  const isLogin =computed(()=>userStore.userInfo.token)//计算属性的映射赋值

  //获取最新购物车列表的action
  const updateNewList= async ()=>{
    const res = await findNewCartListApi()//更新购物车列表
    cartList.value = res.result
  }

  //添加购物车
  const cartList=ref([])
  const addCart = async (goods)=>{
            const {skuId,count}=goods
            if(isLogin.value){
                //登录之后的购物车逻辑
                await insertCartApi({skuId,count})//加入购物车
                updateNewList()
            }else{
                //添加购物车
                //已经添加过- count+1
                //没有添加过 -直接push
                /* 思路：通过匹配传递过来的商品对象中的skuId能不能在cartList中找到，找到了就是添加过 */
                const item=cartList.value.find((item)=>goods.skuId===item.skuId)
                if(item){
                  //找到
                  item.count++
                }else{
                  //没找到
                  cartList.value.push(goods)
                }
            }
    }

  //删除购物车
  const delCart= async (skuId)=>{
    if(isLogin.value){
      //调用接口实现接口购物车中的删除功能
      await delCartApi([skuId])//删除
      updateNewList()
    }else{
       /* 1.找到要删除的下标值 -splice
          2.使用数组的过滤方法 -filter*/
          const idx=cartList.value.findIndex((item)=>skuId===item.skuId)
          cartList.value.splice(idx,1)
    }
  }
  //清除购物车
  const clearCart=()=>{
    cartList.value=[]
  }
  //单选功能
  const singleCheck=(skuId,selected)=>{
    const item=cartList.value.find((item)=>item.skuId===skuId)
    item.selected=selected
  }
  //全选功能
  const allCheck=(selected)=>{
    cartList.value.forEach((item)=>item.selected=selected)
  }
  //计算属性
  cartList.value.reduce((a,c)=>a+c.price,0)
  const allCount=computed(()=>cartList.value.reduce((a,c)=>a+c.count,0))//总数量
  const allPrice=computed(()=>cartList.value.reduce((a,c)=>a+c.count*c.price,0))//总价钱
  const selectedCount=computed(()=>cartList.value.filter((item)=>item.selected).reduce((a,c)=>a+c.count,0))//已选择总数量
  const selectedPrice=computed(()=>cartList.value.filter((item)=>item.selected).reduce((a,c)=>a+c.price*c.count,0))//已选择总价钱
  const isAll=computed(()=>cartList.value.every((item)=>item.selected))//是否全选
  return {
    cartList,
    allCount,
    allPrice,
    isAll,
    selectedCount,
    selectedPrice,
    addCart,
    delCart,
    singleCheck,
    allCheck,
    clearCart,
    updateNewList
  }
},{
  persist:true
}
 )
